package net.halflite.mzkr.service;

import java.util.List;

import org.seasar.extension.jdbc.AutoSelect;
import org.seasar.extension.jdbc.Where;
import org.seasar.extension.jdbc.service.S2AbstractService;


/**
 * サービスの抽象クラスです。
 * 
 * @param <ENTITY>
 *            エンティティの型 
 */
public abstract class AbstractService<ENTITY> extends S2AbstractService<ENTITY> {
	
	/** 
	 * 条件に合うレコードが存在するのか判定
	 * 
	 * @param condition 検索条件
	 * @return true:存在する false:存在しない
	 */
	public boolean exist(Where condition) {
		List<ENTITY> result = select().where(condition).maxRows(1).getResultList();
		return !result.isEmpty();
	}
	
	public <T> void insertRecord(T entity) {
		jdbcManager.insert(entity).execute();
	}

	public <T> void insertIncludes(T entity, CharSequence... propertyNames) {
		jdbcManager.insert(entity).includes(propertyNames).execute();
	}
	
	public <T> void insertExcludes(T entity, CharSequence... propertyNames) {
		jdbcManager.insert(entity).excludes(propertyNames).execute();
	}

	public <T> void updateRecord(T entity) {
		jdbcManager.update(entity).execute();
	}

	public <T> void updateIncludes(T entity, CharSequence... propertyNames) {
		jdbcManager.update(entity).includes(propertyNames).execute();
	}

	public <T> void deleteRecord(T entity) {
		jdbcManager.delete(entity).execute();
	}

	/** 
	 * エンティティを指定してAutoSelectを取得
	 * 
	 * @param <T> エンティティの型
	 * @param base エンティティのクラス型
	 * @return AutoSelect<T>を返します。
	 */
	public <T> AutoSelect<T> select(Class<T> base) {
		return jdbcManager.from(base);
	}
}